package com.carlinfo.stu_ques.common.dao.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import com.carlinfo.stu_ques.common.dao.IBaseDao;
import com.carlinfo.stu_ques.common.util.DbUtil;
import com.carlinfo.stu_ques.common.util.FileUtil;



public class BaseDaoImpl<E> implements IBaseDao<E>{
	
	protected  int id = 1;
	
	protected File parentFile = new File("./data");
	
	protected  int temId;
	protected FileUtil fileUtil = new FileUtil();
	protected DbUtil dbUtil = new DbUtil();
	
	/**
	 * 文件工具类
	 */
	protected FileUtil fileutil = new FileUtil();
	
	/**
	 * 将数据存入map中，用id作为主键，并排序，用TreeMap
	 */
	protected Map<Integer, E> resultyMap = new TreeMap<Integer, E>();
	
	public void readFile(File file) {
		try {
			FileInputStream fis = new FileInputStream(file);

			Object obj = this.fileutil.readObject(fis);
			if (obj != null) {
				List<Object> li = (List<Object>) obj;
				/**
				 * 将map和id的最大值都放进list
				 * list的第一个值是map，第二个值是id的最大值
				 */
				this.resultyMap = (Map<Integer, E>) li.get(0);
				this.id = (int) li.get(1);
			}
		} catch (FileNotFoundException e) {
			System.out.println("文件不存在，你是第一次运行a");
		}
	}
	
	public void writeFile(File file) {
		try {
			if (!file.getParentFile().exists()) {
				/* 如果文件夹不存在，先创建文件夹 */
				file.getParentFile().mkdirs();
			}
			FileOutputStream fos = new FileOutputStream(file);
			List<Object> list = new ArrayList<Object>();
			list.add(this.resultyMap);
			list.add(this.id);
			if (!fileutil.writeObject(fos, list)) {
				System.out.println("我存储失败了");
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

	}

	/**
	 * id不重复，自加，只要添加，就调用此方法，让id+1
	 */
	protected void idCount() {
		this.id++;
	}
	
	/**
	 * 添加一条
	 */
	@Override
	public int saveOneDao(E e) {	
		this.idCount();
//		System.out.println("我保存了");
		resultyMap.put(temId, e);
		return temId;
	}

	/**
	 * 更新一条
	 */
	@Override
	public void updateOneDao(E e) {
//		System.out.println("我更新了");
		resultyMap.put(temId, e);
		
	}

	/**
	 * 删除一条
	 */
	@Override
	public void deleteOneDao(E e) {
//		System.out.println("我删除了一条");
		resultyMap.remove(this.temId);	
	}

	/**
	 * 查询所有
	 */
	@Override
	public List<E> selectListDao() {
//		System.out.println("我查询了List");
		List<E> list = new ArrayList<E>();
		for (Integer key : resultyMap.keySet()) {
			list.add(resultyMap.get(key));
		}
		return list;
	}

	@Override
	public E selectOneDao(Map<String, Object> condMap) {
//		System.out.println("我查询了一条");
		if (condMap.get("id") != null) {
			return resultyMap.get(condMap.get("id"));
		}
		return null;
	}

	@Override
	public int selectMaxId()
	{
		return this.id-1;
	}

	@Override
	public boolean dbToFile(String path)
	{	
		return false;
	}

	@Override
	public boolean fileToDb()
	{	
		return false;
	}
}